summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/am/applet.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/am/applet.h')
-rw-r--r--src/core/hle/service/am/applet.h164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/core/hle/service/am/applet.h b/src/core/hle/service/am/applet.h
new file mode 100644
index 000000000..9650a2615
--- /dev/null
+++ b/src/core/hle/service/am/applet.h
@@ -0,0 +1,164 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <list>
+#include <mutex>
+
+#include "common/math_util.h"
+#include "core/hle/service/apm/apm_controller.h"
+#include "core/hle/service/caps/caps_types.h"
+#include "core/hle/service/event.h"
+#include "core/hle/service/kernel_helpers.h"
+#include "core/hle/service/service.h"
+
+#include "core/hle/service/am/am_types.h"
+#include "core/hle/service/am/applet_message_queue.h"
+#include "core/hle/service/am/hid_registration.h"
+#include "core/hle/service/am/managed_layer_holder.h"
+#include "core/hle/service/am/process.h"
+#include "core/hle/service/am/storage.h"
+#include "core/hle/service/am/system_buffer_manager.h"
+
+namespace Service::Nvnflinger {
+class FbShareBufferManager;
+class Nvnflinger;
+} // namespace Service::Nvnflinger
+
+namespace Service::AM {
+
+class AppletStorageChannel {
+public:
+ explicit AppletStorageChannel(KernelHelpers::ServiceContext& ctx);
+ ~AppletStorageChannel();
+
+ void PushData(std::shared_ptr<IStorage> storage);
+ Result PopData(std::shared_ptr<IStorage>* out_storage);
+ Kernel::KReadableEvent* GetEvent();
+
+private:
+ std::mutex m_lock{};
+ std::deque<std::shared_ptr<IStorage>> m_data{};
+ Event m_event;
+};
+
+struct AppletStorageHolder {
+ explicit AppletStorageHolder(Core::System& system);
+ ~AppletStorageHolder();
+
+ KernelHelpers::ServiceContext context;
+
+ AppletStorageChannel in_data;
+ AppletStorageChannel interactive_in_data;
+ AppletStorageChannel out_data;
+ AppletStorageChannel interactive_out_data;
+ Event state_changed_event;
+};
+
+struct Applet {
+ explicit Applet(Core::System& system, std::unique_ptr<Process> process_);
+ ~Applet();
+
+ // Lock
+ std::mutex lock{};
+
+ // Event creation helper
+ KernelHelpers::ServiceContext context;
+
+ // Applet message queue
+ AppletMessageQueue message_queue;
+
+ // Process
+ std::unique_ptr<Process> process;
+
+ // Creation state
+ AppletId applet_id{};
+ AppletResourceUserId aruid{};
+ AppletProcessLaunchReason launch_reason{};
+ AppletType type{};
+ ProgramId program_id{};
+ LibraryAppletMode library_applet_mode{};
+ s32 previous_program_index{-1};
+ ScreenshotPermission previous_screenshot_permission{ScreenshotPermission::Enable};
+
+ // hid state
+ HidRegistration hid_registration;
+
+ // vi state
+ SystemBufferManager system_buffer_manager{};
+ ManagedLayerHolder managed_layer_holder{};
+
+ // Applet common functions
+ Result terminate_result{};
+ s32 display_logical_width{};
+ s32 display_logical_height{};
+ Common::Rectangle<f32> display_magnification{0, 0, 1, 1};
+ bool home_button_double_click_enabled{};
+ bool home_button_short_pressed_blocked{};
+ bool home_button_long_pressed_blocked{};
+ bool vr_mode_curtain_required{};
+ bool sleep_required_by_high_temperature{};
+ bool sleep_required_by_low_battery{};
+ s32 cpu_boost_request_priority{-1};
+ bool handling_capture_button_short_pressed_message_enabled_for_applet{};
+ bool handling_capture_button_long_pressed_message_enabled_for_applet{};
+ u32 application_core_usage_mode{};
+
+ // Application functions
+ bool gameplay_recording_supported{};
+ GameplayRecordingState gameplay_recording_state{GameplayRecordingState::Disabled};
+ bool jit_service_launched{};
+ bool is_running{};
+ bool application_crash_report_enabled{};
+
+ // Common state
+ FocusState focus_state{};
+ bool sleep_lock_enabled{};
+ bool vr_mode_enabled{};
+ bool lcd_backlight_off_enabled{};
+ APM::CpuBoostMode boost_mode{};
+ bool request_exit_to_library_applet_at_execute_next_program_enabled{};
+
+ // Channels
+ std::deque<std::vector<u8>> user_channel_launch_parameter{};
+ std::deque<std::vector<u8>> preselected_user_launch_parameter{};
+
+ // Caller applet
+ std::weak_ptr<Applet> caller_applet{};
+ std::shared_ptr<AppletStorageHolder> caller_applet_storage{};
+ bool is_completed{};
+
+ // Self state
+ bool exit_locked{};
+ s32 fatal_section_count{};
+ bool operation_mode_changed_notification_enabled{true};
+ bool performance_mode_changed_notification_enabled{true};
+ FocusHandlingMode focus_handling_mode{};
+ bool restart_message_enabled{};
+ bool out_of_focus_suspension_enabled{true};
+ Capture::AlbumImageOrientation album_image_orientation{};
+ bool handles_request_to_display{};
+ ScreenshotPermission screenshot_permission{};
+ IdleTimeDetectionExtension idle_time_detection_extension{};
+ bool auto_sleep_disabled{};
+ u64 suspended_ticks{};
+ bool album_image_taken_notification_enabled{};
+ bool record_volume_muted{};
+
+ // Events
+ Event gpu_error_detected_event;
+ Event friend_invitation_storage_channel_event;
+ Event notification_storage_channel_event;
+ Event health_warning_disappeared_system_event;
+ Event acquired_sleep_lock_event;
+ Event pop_from_general_channel_event;
+ Event library_applet_launchable_event;
+ Event accumulated_suspended_tick_changed_event;
+ Event sleep_lock_event;
+
+ // Frontend state
+ std::shared_ptr<Frontend::FrontendApplet> frontend{};
+};
+
+} // namespace Service::AM